package com.melon.aop;

import com.melon.utils.GSON;
import lombok.extern.log4j.Log4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Created by zhiqi.shao on 2017/5/19.
 */
@Log4j
@Aspect
@Component
public class WebLogAspect {

    ThreadLocal<Long> startTime = new ThreadLocal<>();

    @Pointcut("execution(public * com.melon.web..*.*(..))")
    public void webLog(){}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        log.info("*****request url：" + request.getRequestURL());

        StringBuilder sb = new StringBuilder();
        Object[] os = joinPoint.getArgs();
        for (Object o : os) {
            if (o instanceof HttpSession ||o instanceof HttpServletResponse || o instanceof HttpServletRequest|| o instanceof  Exception) {
                continue;
            }
            sb.append(GSON.toJson(o) + ":");
        }
        log.info("*****request parameters：" + sb.toString());

        startTime.set(System.currentTimeMillis());

        // 省略日志记录内容
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求，返回内容
        log.info("*****response contents : " + GSON.toJson(ret));
        log.info("*****response time : " + (System.currentTimeMillis() - startTime.get()) + "ms");
    }


}




